home *** CD-ROM | disk | FTP | other *** search
/ JCSM Shareware Collection 1993 November / JCSM Shareware Collection - 1993-11.iso / cl760 / garfforj.lzh / GRAPH.FOR < prev    next >
Text File  |  1991-01-17  |  9KB  |  206 lines

  1.       PROGRAM GRAPH
  2. *---------------------------------------------------------------------
  3. * Fortran source GRAPH.for v3.0      Copyright (C) D.I.Hoyer, 1991
  4. *---------------------------------------------------------------------
  5.       COMMON /GRF/XMINA,XMAXA,YMINA,YMAXA,XMIN,YMIN,XMAX,YMAX,MAXX,
  6.      $            MAXY,MMAXX,MMAXY,LOHI,IVH,LOGX,LOGY,DPIV,DPIH
  7.       INTEGER*2 IGRAPH
  8.       CHARACTER*80 GLABEL, XLABEL, YLABEL, LEGEND, STRNG
  9.       DIMENSION IGRAPH(1040,110), X(200), Y(200), P(20)
  10. *----------------------------------------------------------------------
  11. * Graph plotting on dot matrix printers.
  12. *
  13. * This is a sample main program for plotting a graph from a data file,
  14. * which must be set up as described in the manual.
  15. *
  16. * The program set for IBM, Epson LX-800, and Star type dot matrix printers.
  17. * If you have a printer which uses different graphics commands, or if
  18. * the graph doesn't appear to print properly, check your printer manual
  19. * and change the appropriate parameters in subroutine PRTGRF.
  20. *
  21. * Maximum graph size (nominal, for Hi-res plotting) = 20 x 25 cm.
  22. *
  23. * If your compiler cannot handle large arrays
  24. * --------------------------------------------
  25. * (bigger than 64k say) you will have to re-dimension the
  26. * DIMENSION IGRAPH(1040,110) statement at the top of this file:
  27. * DIMENSION IGRAPH(a,b) : a = max no. of dot columns across page
  28. *                         b = (max no of dot rows)/14 + 1
  29. *           Memory required = 2*a*b bytes.
  30. *       Maximum graph width = a/(horizontal dots per inch)
  31. *      Maximum graph height = 14*b/(vertical dots per inch)
  32. * Try out some values to see which compile correctly, giving you a page
  33. * width and height which is acceptable. Obviously in high resolution
  34. * the maximum graph size will be smaller. You will have to make sure
  35. * that you don't specify axis lengths too long for the IGRAPH array size:
  36. * XL, YL, BWLEFT, BWRGHT, BWTOP, BWBOTT. You may have to modify the
  37. * appropriate lines in the graph.00? files (line 4 in each file).
  38. *
  39. * GLABEL, XLABEL & YLABEL : Graph heading, and X & Y axis labels.
  40. * XL     = Length of x-axis, cm.
  41. * YL     = Length of y-axis, cm.
  42. * BWLEFT = Border width to left of axes, cm.
  43. * BWRGHT = Border width to right of axes, cm.
  44. * BWTOP  = Border width above axes, cm.
  45. * BWBOTT = Border width below axes, cm.
  46. * IORIYV = Orientation of y-axis values.
  47. *           (0=numbers parallel to y-axis, 1=perpendicular to y-axis)
  48. * MAXX   = Number of dots across x-axis. (calculated by PREP)
  49. * MAXY   = Number of dots along y-axis.  (calculated by PREP)
  50. * XMIN, XMAX, YMIN, YMAX = Min & max x,y values to define edges of
  51. *                          plotting area.
  52. * XMINA, XMAX, YMINA, YMAXA = Total plotting area, including space above,
  53. *                             below and left of the graph for labels. These
  54. *                             are calculated by PREP
  55. * NDIVX, NDIVY   = No of divisions along axes (0 for log. scales)
  56. * NSDIVX, NSDIVY = No of secondary divisions along axes (between other
  57. *                  divisions). Use 1 or 9 for log. scales.
  58. * NDPX, NDPY     = No of decimal places to be printed after dec. point, for
  59. *                  axis values. Ignored for log. scales.
  60. * IVH   = 1 for vertical (portrait) printout, 2 for horizontal (landscape).
  61. * IGRPRT= 1 to print the axes,
  62. *         0 to suppress printing of axes.
  63. * LOHI  = 1 for Low-res (quick) plot, 2 for Hi-Res.
  64. * IOFF  = Offset. This number of blank spaces will be printed from the left
  65. *                 margin ahead of the graph.
  66. * IGRDx1,x2,y1,y2 = 1 to n for grid lines of line type LTYP (major/minor divs),
  67. *                   0 for no grid lines.
  68. * ISZTTL= The text size for printing the graph title
  69. * TTLPOS= To adjust the distance between axis and centre of graph title.
  70. *           (>0 = Above top axis, <0 = below bottom axis
  71. *           magnitude: 1=default, <1=closer to axis, >1=further from axis)
  72. * XLBPOS= To adjust the distance between x-axis and x-axis label.
  73. *           1=default, <1=closer to axis, >1=further from axis.
  74. * YLBPOS= As for XLBPOS, but for y-axis. eg. If IORIYV=1 and the y-axis
  75. *         values are several characters long, set YLBPOS>1 to shift the
  76. *         label further away from the axis.
  77. * JUSTTL= Justification of graph title. (-1=left, 0=centre, 1=right)
  78. * LGDPOS= Position of legend block. 1 = top left, to 4 = top right.
  79. *                                   5 = bott. " , to 8 = bott. "  .
  80. * LGDSIZ= Size of text for legend table (for drawing the legend box)
  81. * LGDPOS= Position of the legend box.
  82. *           (1..4 = top left to top right, 5..8 = bottom left to bottom rt)
  83. * LGDLNS= Number of lines of text to be allocated for legend box
  84. *           (set to 0 for no legend box)
  85. * LGDCHS= Max number of characters in a legend text (for the legend box)
  86. * LGDTYP= Line type for surrounding the legend box (0=none, 1=solid etc)
  87. * NPTS  = No of data points for current data set, or if <=0 then..
  88. *           0 to plot a function curve,
  89. *          -1 for plotting a text string,
  90. *          -2 to clear a rectangular area of the graph, with optional border.
  91. * LTYP  = Line type for joining points.
  92. *         0 = no line,
  93. *         1 to 5 straight lines,
  94. *         -5 to -1 for cubic spline fit (smooth curve).
  95. * MARK  = Symbol to be plotted at each point
  96. *         (1 = dot, 2..8 = symbol, 32..126 = ASCII character)
  97. * MSIZE = Size of MARK (1..n) Try 2 or 3 for a start.
  98. * LEGEND= Text to describe each data set.
  99. *         Blank to suppress.
  100. * IFN   = Function number (pre-compiled in FUNCT) to plot if NPTS=0.
  101. * NPARMS= Number of parameters to be passed to function IFN (max 100).
  102. * P(J),J=1,NPARMS = The parameters to be passed to function IFN.
  103. * ITXSIZ= Size of text to be plotted (1 to n).  2 = "normal".
  104. * STRNG = A string of text to be printed on the graph
  105. *
  106. * MMAXX,MMAXY are for passing the dimension of IGRAPH through subs.
  107. *             (calculated by PREP)
  108. *             MMAXX is the number of columns of dots across the page,
  109. *             MMAXY is the (number of rows of dots)/14
  110. *
  111.       READ(5,101) GLABEL
  112.       READ(5,101) XLABEL
  113.       READ(5,101) YLABEL
  114.       READ(5,505) XL, YL, BWLEFT, BWRGHT, BWTOP, BWBOTT
  115.       READ(5,505) XMIN, XMAX, YMIN, YMAX
  116.       READ(5,202) NDIVX, NSDIVX, IGRDX1, IGRDX2, NDPX
  117.       READ(5,202) NDIVY, NSDIVY, IGRDY1, IGRDY2, NDPY
  118.       READ(5,202) ISZVAL, ISZXYL, IORIYV, ISZTTL, JUSTTL
  119.       READ(5,505) VALPOS, XLBPOS, YLBPOS, TTLPOS
  120.       READ(5,202) IGRPRT, IVH, LOHI, IOFF
  121.       READ(5,202) LGDPOS, LGDLNS, LGDCHS, LGDSIZ, LGDTYP
  122. *
  123.  101  FORMAT(A80)
  124.  202  FORMAT(8I10)
  125.  505  FORMAT(8F10.0)
  126. *
  127. * Do some preparations/calcs before plotting axes or data.
  128. * Subroutine PREP must be called before any plotting is done.
  129. *
  130.       LOGX = NDIVX
  131.       LOGY = NDIVY
  132.       DPIH = 60.
  133.       DPIV = 72.
  134.       CALL PREP(XMIN,YMIN,XMAX,YMAX,LOGX,LOGY,LOHI,IVH,XL,YL,BWLEFT,
  135.      $          BWRGHT,BWTOP,BWBOTT,DPIV,DPIH)
  136. *
  137. * Clear the graph (this is only necessary if you want your program
  138. * to print more than one graph, as the first graph is clear when you start).
  139. * Remove the comment asterisk in column 1 to activate the next line if you
  140. * need to clear the graph:
  141. *
  142. *      CALL CLRGRF(MMAXX,MMAXY,IGRAPH)
  143. *
  144. * Draw the axes
  145. *
  146.       IF(IGRPRT.EQ.1) CALL AXES(NDIVX,IGRDX1,NSDIVX,IGRDX2,NDPX,XLABEL,
  147.      $ NDIVY,IGRDY1,NSDIVY,IGRDY2,NDPY,YLABEL,IORIYV,GLABEL,ISZVAL,
  148.      $ VALPOS,ISZXYL,XLBPOS,YLBPOS,ISZTTL,TTLPOS,JUSTTL,LGDSIZ,LGDPOS,
  149.      $ LGDLNS,LGDCHS,LGDTYP,IGRAPH)
  150. *
  151. * Read and plot the sets of data. Each set of data can be one of...
  152. *   a) Clearing a rectangular area of the graph, with optional border;
  153. *   b) Write text at (x,y), with any size, orientation and justification;
  154. *   c) Plot one of the continuous functions from subroutine GRAPHFNS
  155. *   d) Plot a set of points, with optional straight lines or smooth curve
  156. *      through the points.
  157. *
  158.       ILEGND = 0
  159. 1000  READ(5,707) NPTS, LTYP, MARK, MSIZE, INOUT, LEGEND
  160.  707  FORMAT(5I5,A)
  161.  
  162. * NPTS=-99 indicates end of data. Plot the graph and terminate the program.
  163.       IF(NPTS.EQ.-99) GOTO 2000
  164.  
  165. * If NPTS=-2 then clear a rectangular graph area between coordinates
  166. * (x1,y1) to (x2,y2)
  167.       IF(NPTS.EQ.-2) THEN
  168.         READ(5,505) X(1), Y(1), X(2), Y(2)
  169.  
  170. * If NPTS=-1 then plot text at coordinate value (xx,yy) .
  171.       ELSEIF(NPTS.EQ.-1) THEN
  172.         READ(5,808) IORI, ITXSIZ, JUSTIF, X(1), Y(1)
  173.  808    FORMAT(3I10,2F10.0)
  174.         READ(5,909) STRNG
  175.  909    FORMAT(A)
  176.  
  177. * If NPTS=0 then a function plot is required.
  178.       ELSEIF(NPTS.EQ.0) THEN
  179.         READ(5,404) IFN, NPARMS, X(1), X(2)
  180.  404    FORMAT(2I10,2F10.0)
  181.         READ(5,505) (P(J),J=1,NPARMS)
  182.  
  183. * Otherwise a set of points is to be plotted
  184.       ELSE
  185.         READ(5,303) (X(J),Y(J),J=1,NPTS)
  186.  303    FORMAT(2F10.0)
  187.       ENDIF
  188. *-------Plot the data set (text, function or points)
  189.       CALL PLOTD(NPTS,LTYP,MARK,MSIZE,LEGEND,IORI,ITXSIZ,JUSTIF,
  190.      $ INOUT,IGRAPH,STRNG,IFN,P,X,Y,ILEGND,LGDPOS,LGDSIZ)
  191. *
  192. * Print out the graph
  193. *
  194.       GOTO 1000
  195. 2000  CALL PRTGRF(IOFF,MMAXX,MMAXY,LOHI,IGRAPH)
  196.       STOP
  197.       END
  198.  
  199. *---------------------------------------------------------------------------
  200. * Include the subroutine libraries...
  201.  
  202.       INCLUDE "GRAPHFNS.for"
  203.       INCLUDE "GRAPHLIB.for"
  204.  
  205. *---------------------------------------------------------------------------
  206.